package org.gbif.checklistbank.service.mybatis; import org.gbif.checklistbank.service.mybatis.guice.ChecklistBankServiceMyBatisModule; import org.gbif.checklistbank.service.mybatis.postgres.ClbDbTestRule; import java.lang.annotation.Annotation; import javax.annotation.Nullable; import com.google.inject.Guice; import com.google.inject.Injector; import com.google.inject.Key; import com.google.inject.Module; import org.junit.Before; import org.junit.Rule; public class MyBatisServiceITBase<T> { private final Class<T> serviceClass; private final Class<? extends Annotation> annotationType; private Injector injector; protected T service; @Rule public ClbDbTestRule dbSetup = ClbDbTestRule.squirrels(); public MyBatisServiceITBase(Class<T> serviceClass) { this(serviceClass, null); } public MyBatisServiceITBase(Class<T> serviceClass, @Nullable Class<? extends Annotation> annotationType) { this.serviceClass = serviceClass; this.annotationType = annotationType; } @Before public void init() throws Exception { Module module = new ChecklistBankServiceMyBatisModule(dbSetup.getProperties()); injector = Guice.createInjector(module); if (annotationType != null) { service = injector.getInstance(Key.get(serviceClass, annotationType)); } else { service = injector.getInstance(serviceClass); } } public <K> K getInstance(Class<K> clazz) { return injector.getInstance(clazz); } public <K> K getInstance(Class<K> clazz, Class<? extends Annotation> annotationType) { return injector.getInstance(Key.get(clazz, annotationType)); } public <K> K getInstance(Key<K> key) { return injector.getInstance(key); } }